//
//  JCStatus.swift
//  weibo07777
//
//  Created by mac on 15/12/23.
//  Copyright © 2015年 mac. All rights reserved.
//

import UIKit

// -[__NSCFNumber length]: unrecognized selector sent to instance 0xb0def2ca965ddb43, 看看是不是模型的属性类型出现错误

class JCStatus: NSObject {
    /// 1.定义模型属性
    
    // MARK: - 属性
    /// 创建时间
    var created_at: String?
    
    /// 微博id
    var id: Int64 = 0
    
    /// 微博正文内容
    var text: String?
    
    /// 来源
    var source: String?
    
    /// 微博的配图 [String: AnyObject]
    var pic_urls: [[String: AnyObject]]? // 数组,里面的元素是字典
    
    /// 转发数
    var reposts_count: Int = 0
    
    /// 评论数
    var comments_count: Int = 0
    
    /// 表态数(赞)
    var attitudes_count: Int = 0
    
    /// 用户模型
    var user: JCUser?
    
    // 2.字典转模型
    init(dict: [String: AnyObject]) {
        // 在init之前能赋值,就可以不加?
        super.init()
        
        // 使用KVC来赋值所有属性, KVC是一个方法,方法是只有对象初始化完毕之后才能调用
        setValuesForKeysWithDictionary(dict)
    }
    
    // 3.字典的key在模型中找不到对应的属性,需要实现 forUndefinedKey
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
    
    // setValuesForKeysWithDictionary传入的key有多少个就会调用用多少次,并且传入相应的key和value
    override func setValue(value: AnyObject?, forKey key: String) {
//        print("key: \(key)")
        // 判断如果是user这个key,我们自己来字典转模型,不需要kvc
        if key == "user" {
            // 我们自己来字典转模型
            if let dict = value as? [String: AnyObject] {
                let userModel = JCUser(dict: dict)
                
                // 将模型赋值赋值给user属性
                self.user = userModel
            }
            
            // 一定要记得return,不然会调用父类的setValue,会被覆盖
            return
        }
        
        super.setValue(value, forKey: key)
    }
    
    // 4.实现description属性
    override var description: String {
        let prop = ["created_at", "id", "text", "source", "pic_urls", "reposts_count", "comments_count", "attitudes_count", "user"]
        
        // 通过一个数组来生成一个字典,数组中的元素,会成为字典的key,key所对应的value，会从模型中来找对应的属性值
        let dict = dictionaryWithValuesForKeys(prop)
        
        // \n 换行, \t table键
        return "\n\t微博模型: \(dict)"
    }
    
    // MARK: - 加载微博数据
    class func mLoadStatus(finished: (statuses: [JCStatus]?, error: NSError?) -> ()) {
        // 3.直接调用网络工具类的方法来加载微博数据
        // 4.准备闭包
        JCNetWorkTool.sharedInstance.loadStatus { (result, error) -> () in
            // 6.1.判断是否有数据
            if error != nil || result == nil {
                // 没有加载到数据
                // 6.1.1 调用闭包
                finished(statuses: nil, error: error)
                return
            }
            
            // 没有错误,有数据
            // 6.2 字典转模型,判断字典是否有statuses,将statuses的值转成数组,数组里面存放的是字典
            if let array = result?["statuses"] as? [[String: AnyObject]] {
                // 能获取到微博数据
                
                // 6.3 创建一个数组,来存放转好的模型
                var statuses = [JCStatus]()
                
                // 6.4 遍历数组
                // [String: AnyObject] == Dictionary<String, AnyObject>
                for dcit in array {
                    // 6.5 获取到字典,字典转模型
                    let status = JCStatus(dict: dcit)
                    
                    // 6.6 将转好的模型添加到模型数组里面
                    statuses.append(status)
                }
                
                // 6.7 所有的模型都转换完成,告诉调用的人有微博模型数据了
                finished(statuses: statuses, error: nil)
            } else {
                // 6.7
                finished(statuses: nil, error: nil)
            }
        }
    }
}
